/*
 * brief: 本模块作用是监听某个文件句柄是否可读，如果可读则进入注册的回调
 * use  : 1、实例化            CEventLoop
 *        2、注册回调事件      EventRegister
 *        3、循环调度 调度函数 EventSchedule
 * EPOLL原理是将文件句柄注册在内核，当内核发现文件有变化时，拷贝相关事件信息到用户态
 * epoll_wait(epollfd, eventList, epoll_max_events, timeout)  eventList 就是用来内核复制监听结果的
*/
#ifndef __EVENTLOOP_H_
#define __EVENTLOOP_H_

#include "log.h"
#include <deque>
#include <sys/epoll.h>
#include <sys/wait.h>
#include <unistd.h>
#include <map>
#include <fcntl.h> 
using namespace std;



class CEventLoop
{
    class CNullClass
    {
    public:
        CNullClass(){}
        ~CNullClass(){}
    
    };

    //定义空类回调函数
    typedef  void (CNullClass::*CallbackFunc)(int fd, void *data);

    //定义事件元素结构
    typedef struct CBEvent_t
    {
      CNullClass *thisp;
      CallbackFunc func;
      void *data;
    }CBEvent;
   public:
      CEventLoop();
      CEventLoop(int maxeventnum);
      ~CEventLoop();
      //可变参数 this CallbackFunc  自定义数据
      int EventRegister(int fd, ... );
      int EventUnRegister(int fd);
      int EventSchedule(int timeout);
      int EventSetMaxevents(int maxnum);
      void  EventSetNoBlock(int fd);
    private:
      int epollfd;
      int epoll_max_events;
      struct epoll_event *eventList;
      map<int, CBEvent> eventCbList;
};

#endif